import router from '@/router/index'
import store from '@/store'

// 导航守卫,每次跳转前都会经过它
router.beforeEach(async(to, from, next) => {
  // // 已登录
  // if (store.getters.token) {
  //   // 在登录页跳转主页
  //   if (to.path === '/login') {
  //     next('/')
  //   } else {
  //     // 其他页面放行
  //     // 跳转前获取用户数据
  //     // 判断是否有用户数据,没有则获取,有则不用重复获取
  //     if (!store.getters.userId) { // 如果没有用户id才会调用actions
  //       // await 同步执行,因为需求是获取数据才放行
  //       await store.dispatch('user/getUserInfo')
  //     }
  //     next()
  //   }
  // } else {
  // // 未登录
  // // 白名单,无需登录即可访问
  //   const whiteList = ['/login', '/404', '/test']
  //   if (whiteList.indexOf(to.path) !== -1) {
  //     next()
  //   } else {
  //     // 未登录拦截,跳转登录页
  //     next('/login')
  //   }
  // }

  const token = store.getters.token
  const url = to.path
  const whiteList = ['/login', '/404', '/tset']
  // 1.已登录,在登录页 ==>跳转首页
  if (token && url === '/login') {
    next('/')
  }
  // 2.已登录,不是登录页 ==>放行
  if (token && url !== '/login') {
    // 如果没有用户数据
    if (!store.getters.userId) {
      // 调用actions
      await store.dispatch('user/getUserInfo')
      // 触发路由筛选,根据权限访问路由,将用户的权限菜单传入函数
      const routes = await store.dispatch('permission/filterRoutes', store.getters.menus)
      console.log('动态路由', routes)
      // 而动态路由在没有addRoutes之前，找不到对应的地址，就会显示404，所以我们需要将404放置到动态路由的最后
      router.addRoutes([...routes, { path: '*', redirect: '/404', hidden: true }]) // 添加路由
      // 由于追加路由比跳转匹配路径晚,所以跳转时找不到动态路由,页面空白
      // 需要重新跳转到当前路径,再触发跳转路径,此时已有动态路由
      next(to.path)
    } else {
      next()
    }
  }

  // 3.未登录,在白名单 ==>放行
  if (!token && whiteList.indexOf(url) !== -1) {
    next()
  }

  // 4.未登录,不在白名单 ==>跳转login
  if (!token && whiteList.indexOf(url) === -1) {
    next('/login')
  }

  // const token = store.getters.token  //存在token
  // const url = to.path                //to.path表示跳转的路径
  // const whiteList =['/login','/test','/404']
})
